package com.saber.util;

import com.rabbitmq.client.*;
import com.saber.Product;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * Created by PC on 2017/10/18.
 */
public class RabbitmqUtil {

    //单例
    public static RabbitmqUtil instance = new RabbitmqUtil();
    public static ConnectionFactory factory = new ConnectionFactory();

    /**主机地址*/
    private String host;
    /**端口号*/
    private int port;
    /**用户名*/
    private String userName;
    /**密码*/
    private String password;

    /*无参构造方法*/
    private RabbitmqUtil() {
        host = host == null ? "127.0.0.1":host;
        port = port == 0 ? 5672:port;
        userName = userName == null ? "guest":userName;
        password = password == null ? "guest":password;
    }

    /**
     * 有参构造方法
     * @param host      主机地址
     * @param port      端口号
     * @param userName  用户名
     * @param password  密码
     */
    public RabbitmqUtil(String host, int port, String userName, String password) {
        this.host = host;
        this.port = port;
        this.userName = userName;
        this.password = password;
    }

    //实例化方法
    public static RabbitmqUtil getInstance(){
        return instance;
    }

    public static ConnectionFactory getFactoryInstance(){
        try {
            buildConnection();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
        return factory;
    }

    public static void closeFactory(){
        getFactoryInstance().clone();
    }


    public static Connection buildConnection() throws IOException, TimeoutException {
        //创建连接工厂
        //设置RqbbitMQ相关信息
        factory.setHost(instance.host);
        factory.setPort(instance.port);
        factory.setUsername(instance.userName);
        factory.setPassword(instance.password);
        //创建一个新的连接
        Connection connection = factory.newConnection();
        return connection;
    }


    /**
     * 发送消息
     * @param message       文本消息
     * @param queueName     队列名称
     * @return
     */
    public static boolean sendMsg(String queueName,String message){
        try {
            Connection connection = getFactoryInstance().newConnection();
            //创建一个通道
            Channel channel = connection.createChannel();
            //声明一个队列
            // queueDeclare第一个参数表示队列名称、
            // 第二个参数为是否持久化（true表示是，队列将在服务器重启时生存）、
            // 第三个参数为是否是独占队列（创建者可以使用的私有队列，断开后自动删除）、
            // 第四个参数为当所有消费者客户端连接断开时是否自动删除队列、
            // 第五个参数为队列的其他参数
            channel.queueDeclare(queueName, false, false, false, null);
            channel.basicPublish("", queueName, null, message.getBytes("UTF-8"));

            channel.close();
            return true;
        }catch (Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 获取消息
     * @param queueName     队列名称
     * @return
     */
    public static String getMsg(String queueName){
        try {
            Connection connection = getFactoryInstance().newConnection();
            //创建一个通道
            Channel channel = connection.createChannel();
            //声明一个队列
            // queueDeclare第一个参数表示队列名称、
            // 第二个参数为是否持久化（true表示是，队列将在服务器重启时生存）、
            // 第三个参数为是否是独占队列（创建者可以使用的私有队列，断开后自动删除）、
            // 第四个参数为当所有消费者客户端连接断开时是否自动删除队列、
            // 第五个参数为队列的其他参数
            channel.queueDeclare(queueName, false, false, false, null);
            QueueingConsumer consumer = new QueueingConsumer(channel);
            //自动回复队列应答 --RbbitMQ中的消息确认机制
            channel.basicConsume(Product.QUEUE_NAME, true, consumer);

            while (true) {
                QueueingConsumer.Delivery delivery = consumer.nextDelivery();
                String message = new String(delivery.getBody());
                System.out.println(" [x] Received '" + message + "'");
                return message;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }





}
